CTF PWN 总结

这个很久总结的了,基本很久没打比赛了,现在发出来了—— 20190903

本文分为信息泄露和漏洞利用技术,因为很多时候信息泄露都是通用,下面的这两部分会重合

信息泄露

  • 程序本来就给你泄露就再好不过了
  • 利用wrtite,puts,printf等泄露
  • 利用%s这个遇到00才停止的可能可以泄露(strlen,strdup等都需要关注)
  • 格式化字符串%x或这%p泄露
  • uaf的任意读取
  • smallbin(unsortbin)的fd或者bk泄露libc
  • fasbin的fd可泄露heap基址
  • 有时候题目甚至都没泄露函数(wrtite,puts,printf等),这时候就要将某个函数的got表改为输出函数的plt达到可泄露的目的(Hitcon 2014 stkof)
  • 有时候利用strcpy复制到\x00才结束可以利用程序本有的功能泄露,还可以进行溢出
  • 可能还有申请了一个字符串数组,没有初始化清零,即可泄露栈地址,heap或者libc等,应该栈地址比较多

漏洞利用技术

  • dep没开的基本为执行shellcode或者覆盖返回地址为cat flag的函数
  • 覆盖返回地址为getflag的函数
  • 有libc的,泄露之后写/bin/sh到bss,再执行system(静态编译的使用系统调用),没libc就尝试libc database查或者DynELF泄露
  • 有时候栈上的地址不够可以转移到bss或者堆上进行rop,这时候就需要栈翻转了,一般使用pop ebp;ret; leave;ret;这两个gadgets
  • canary的话有条件的可以逐个字节爆破或者利用其他漏洞泄露
  • ret2dlreslove
  • brop(待实践)
  • srop(待实践)
  • 有时可能是纸老虎,seccon 2017 babystack (go lang pwn)

格式化字符串

  • 写got表
  • 假如格式化传在堆上就通过将ebp覆盖为leave,ret的地址,在堆上进行rop
  • 好像0ctf的EasiestPrint就是格式化绕过full relo

  • uaf
  • fastbin attack(包含house of spirit)【可用double free或堆溢出来干】
  • unlink
  • off by one
  • house_of_lore(small bin的前后的chunk伪造)
  • unsortbin attack
  • house_of_force(覆盖top chunk,返回几乎任意的指针)
  • house_of_einherjar(控制pre size操纵合并后的地址)
  • house of orange
  • 堆重叠
  • 利用“堆漏”洞泄露libc,canary,之后覆盖返回地址 0x00ctf 2017 Memo

总的利用方式

其实就是劫持控制流方式

  • 覆盖返回地址
  • 覆盖got表
  • 覆盖malloc hook或这free hook
  • 覆盖虚表指针(简单uaf)
  • 覆盖IO FILE 的vtable并伪造 (0x00sec 2017 babyheap)
  • 覆盖ld的_dl_fini什么的绕过full relo,可以劫持exit函数(这个还需实践)

套路

  • 00截断绕过长度检测
  • 整数溢出绕过数字(长度)检测

堆套路

1、任意地址写:fastbin 的uaf,unlink,普通的uaf
2、泄露堆地址:fastbin的free
3、泄露libc地址:非fastbin的free,如smallbin
4、堆溢出:fastbin的uaf可以在当前堆块伪造同样大小的size之后就可以溢出下一个堆块的size了

重点关注 -1 因为0-1就整数溢出了

题目环境构建

socat tcp-listen:port,fork exec:./程序名,reuseaddr

nc -vc “./程序名” -kl ip port //好像不太行哦

(k即fork)

打赏专区